<?php
include 'vendor/autoload.php';
function cb($data){
	print_r($data);
}
function test($x,$last,$cb){
	static $data=[];
	
	$size=3;
	$data[]=$x;
	
	if(count($data)>=$size || $last){
		
		$cb($data);
		$data=array_slice($data,$size);
	}
	return true;
}

function test2($x,$cb){
	static $data=[];
	
	$size=3;
	$data[]=$x;
	
	if(count($data)>=$size){
		$cb($data);
		$data=[];
	}
	return $data;
}

foreach(range(1,20) as $k=>$v){
	test($v,$k==19,'cb');
}

foreach(range(1,20) as $k=>$v){
	$left=test2($v,'cb');
}
print_r($left);

//https://blog.csdn.net/weixin_39727336/article/details/112404775

//https://packagist.org/packages/spatie/async#1.5.3

/*
use Spatie\Async\Pool;

$pool = Pool::create();

$things=[
	'http://localhost/demo.php?index=100',
	'http://localhost/demo.php?index=200',
	'http://localhost/demo.php?index=300',
	'http://localhost/demo.php?index=400',
	'http://localhost/demo.php?index=500',
	'http://localhost/demo.php?index=600',
	'http://localhost/demo.php?index=700',
	'http://localhost/demo.php?index=800',
	'http://localhost/demo.php?index=900',
	'http://localhost/demo.php?index=1000',
];

foreach ($things as $thing) {
	$pool->add(function () use ($thing) {
		// Do a thing
		return file_get_contents($thing);
	})->then(function ($output) {
		// Handle success
		echo $output;
		echo "\n";
	})->catch(function ($exception) {
		// Handle exception
	});
}

$pool->wait();
*/
/*
下面再大概说下本地并发与PHP多进程编程与实例

本地并发只能通过语言自己的特性在程序本身实现多任务效果，一般来说现在的语言会通过多线程或多进程的方式来实现。由于PHP不支持多线程，目前只能采用多进程方式，让操作系统来帮助实现本地并发。

至于代码实现，可以通过pcntl扩展(封装fork等进程控制函数，和C语言中使用非常相似，windows下不可用)、 proc_open、popen等方式，方法不止一种，

场景：日常任务中，有时需要通过php脚本执行一些日志分析，队列处理等任务，当数据量比较大时，可以使用多进程来处理。

准备：php多进程需要pcntl，posix扩展支持，可以通过 php - m 查看，没安装的话需要重新编译php，加上参数--enable-pcntl，posix一般默认会有。

*/